home *** CD-ROM | disk | FTP | other *** search
- VERSION 5.00
- Begin VB.Form Form1
- Caption = "Point Sprites"
- ClientHeight = 4050
- ClientLeft = 60
- ClientTop = 345
- ClientWidth = 5055
- Icon = "PointSprites.frx":0000
- LinkTopic = "Form1"
- ScaleHeight = 270
- ScaleMode = 3 'Pixel
- ScaleWidth = 337
- StartUpPosition = 3 'Windows Default
- Attribute VB_Name = "Form1"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- ' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
- ' File: PointSprites.frm
- ' Content: Sample showing how to use point sprites to do particle effects
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- Option Explicit
- Option Compare Text
- Private Type CUSTOMVERTEX
- v As D3DVECTOR
- color As Long
- tu As Single
- tv As Single
- End Type
- Const D3DFVF_COLORVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_TEX1)
- Const GROUND_GRIDSIZE = 8
- Const GROUND_WIDTH = 256
- Const GROUND_HEIGHT = 256
- Const GROUND_TILE = 32
- Const GROUND_COLOR = &HBBEEEEEE
- Private Enum PARTICLE_COLORS
- COLOR_WHITE = 0
- COLOR_RED = 1
- COLOR_GREEN = 2
- COLOR_BLUE = 3
- NUM_COLORS = 4
- End Enum
- Dim g_clrColor(4) As D3DCOLORVALUE
- Dim g_clrColorFade(4) As D3DCOLORVALUE
- Dim m_media As String
- Dim m_ParticleSystem As CParticle
- Dim m_ParticleTexture As Direct3DTexture8
- Dim m_NumParticlesToEmit As Long
- Dim m_bStaticParticle As Boolean
- Dim m_nParticleColor As Long
- Dim m_GroundTexture As Direct3DTexture8
- Dim m_NumGroundVertices As Long
- Dim m_NumGroundIndices As Long
- Dim m_GroundIB As Direct3DIndexBuffer8
- Dim m_GroundVB As Direct3DVertexBuffer8
- Dim m_planeGround As D3DPLANE
- Dim m_bDrawReflection As Boolean
- Dim m_bCanDoAlphaBlend As Boolean
- Dim m_bCanDoClipPlanes As Boolean
- Dim m_bDrawHelp As Boolean
- Dim m_matView As D3DMATRIX
- Dim m_matOrientation As D3DMATRIX
- Dim m_vPosition As D3DVECTOR
- Dim m_vVelocity As D3DVECTOR
- Dim m_fYaw As Single
- Dim m_fYawVelocity As Single
- Dim m_fPitch As Single
- Dim m_fPitchVelocity As Single
- Dim m_fElapsedTime As Single
- Dim m_bKey(256) As Boolean
- Dim g_fTime As Single
- Dim g_fLastTime As Single
- Dim m_grVerts() As CUSTOMVERTEX
- Dim m_grVerts2() As CUSTOMVERTEX
- Dim m_binit As Boolean
- Dim m_bMinimized As Boolean
- Dim m_bStopSim As Boolean
- Const kMaxParticles = 128
- Const kParticleRadius = 0.01
- '-----------------------------------------------------------------------------
- ' Name: Form_KeyPress()
- ' Desc:
- '-----------------------------------------------------------------------------
- Private Sub Form_KeyPress(KeyAscii As Integer)
- If Chr$(KeyAscii) = "r" Then m_bDrawReflection = Not m_bDrawReflection
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Form_Load()
- ' Desc:
- '-----------------------------------------------------------------------------
- Private Sub Form_Load()
- Me.Show
- DoEvents
- 'setup defaults
- Init
- ' Initialize D3D
- ' Note: D3DUtil_Init will attempt to use D3D Hardware acceleartion.
- ' If it is not available it attempt to use the Software Reference Rasterizer.
- ' If all fail it will display a message box indicating so.
- '
- m_binit = D3DUtil_Init(Me.hwnd, True, 0, 0, D3DDEVTYPE_HAL, Me)
- If Not (m_binit) Then End
- ' find Media and set media path
- m_media = FindMediaDir("ground2.bmp")
- D3DUtil_SetMediaPath m_media
- ' Set initial state
- OneTimeSceneInit
- ' Load Mesh and textures from media
- InitDeviceObjects
- ' Set device render states, lighting, camera
- RestoreDeviceObjects
- ' Start Timer
- DXUtil_Timer TIMER_start
- ' Start our timer
- DXUtil_Timer TIMER_start
- ' Run the simulation forever
- ' See Form_Keydown for exit processing
- Do While True
- ' Increment the simulation
- FrameMove
-
- ' Render one image of the simulation
- If Render Then
-
- ' Present the image to the screen
- D3DUtil_PresentAll g_focushwnd
- End If
-
- ' Allow for events to get processed
- DoEvents
-
- Loop
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Form_KeyDown()
- ' Desc: Process key messages for exit and change device
- '-----------------------------------------------------------------------------
- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
-
- m_bKey(KeyCode) = True
-
- Select Case KeyCode
-
- Case vbKeyEscape
- Unload Me
-
- Case vbKeyF2
-
- ' Pause the timer
- DXUtil_Timer TIMER_STOP
- m_bStopSim = True
- ' Bring up the device selection dialog
- ' we pass in the form so the selection process
- ' can make calls into InitDeviceObjects
- ' and RestoreDeviceObjects
- frmSelectDevice.SelectDevice Me
-
- ' Restart the timer
- m_bStopSim = False
- DXUtil_Timer TIMER_start
-
- Case vbKeyReturn
-
- ' Check for Alt-Enter if not pressed exit
- If Shift <> 4 Then Exit Sub
-
- ' stop simulation
- DXUtil_Timer TIMER_STOP
- m_bStopSim = True
-
- ' If we are windowed go fullscreen
- ' If we are fullscreen returned to windowed
- If g_d3dpp.Windowed Then
- D3DUtil_ResetFullscreen
- Else
- D3DUtil_ResetWindowed
- End If
-
- ' Call Restore after ever mode change
- ' because calling reset looses state that needs to
- ' be reinitialized
- RestoreDeviceObjects
-
- ' Restart simulation
- DXUtil_Timer TIMER_STOP
- m_bStopSim = False
- End Select
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Form_KeyUp()
- ' Desc: Process key messages for exit and change device
- '-----------------------------------------------------------------------------
- Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
- m_bKey(KeyCode) = False
- End Sub
- Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
- DXUtil_Timer (TIMER_STOP)
- m_bStopSim = True
- End Sub
- Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
- DXUtil_Timer (TIMER_start)
- m_bStopSim = False
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Form_Resize()
- ' Desc: hadle resizing of the D3D backbuffer
- '-----------------------------------------------------------------------------
- Private Sub Form_Resize()
- ' If D3D is not initialized then exit
- If Not m_binit Then Exit Sub
- ' If we are in a minimized state stop the timer and exit
- If Me.WindowState = vbMinimized Then
- DXUtil_Timer TIMER_STOP
- m_bMinimized = True
- m_bStopSim = True
- Exit Sub
-
- ' If we just went from a minimized state to maximized
- ' restart the timer
- Else
- If m_bMinimized = True Then
- DXUtil_Timer TIMER_start
- m_bMinimized = False
- m_bStopSim = False
- End If
- End If
-
- ' Dont let the window get too small
- If Me.ScaleWidth < 10 Then
- Me.width = Screen.TwipsPerPixelX * 10
- Exit Sub
- End If
- If Me.ScaleHeight < 10 Then
- Me.height = Screen.TwipsPerPixelY * 10
- Exit Sub
- End If
- m_ParticleSystem.DeleteDeviceObjects
- Set m_ParticleSystem = Nothing
- Set m_ParticleSystem = New CParticle
- 'reset and resize our D3D backbuffer to the size of the window
- D3DUtil_ResizeWindowed Me.hwnd
- 'All state get losts after a reset so we need to reinitialze it here
- RestoreDeviceObjects
- DXUtil_Timer TIMER_STOP
- m_ParticleSystem.Init kMaxParticles, kParticleRadius
- m_ParticleSystem.InitDeviceObjects g_dev
- DXUtil_Timer TIMER_RESET
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Form_Unload()
- ' Desc:
- '-----------------------------------------------------------------------------
- Private Sub Form_Unload(Cancel As Integer)
- DeleteDeviceObjects
- End
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Init()
- ' Desc: Constructor
- '-----------------------------------------------------------------------------
- Sub Init()
- Me.Caption = "PointSprites: Using particle effects"
-
-
- Set m_ParticleSystem = New CParticle
- m_ParticleSystem.Init kMaxParticles, kParticleRadius
- Set m_ParticleTexture = Nothing
- m_NumParticlesToEmit = 10
- m_bStaticParticle = True
- m_nParticleColor = COLOR_WHITE
- Set m_GroundTexture = Nothing
- m_NumGroundVertices = (GROUND_GRIDSIZE + 1) * (GROUND_GRIDSIZE + 1)
- m_NumGroundIndices = (GROUND_GRIDSIZE * GROUND_GRIDSIZE) * 6
- Set m_GroundVB = Nothing
- Set m_GroundIB = Nothing
- m_planeGround = D3DPLANE4(0, 1, 0, 0)
- m_bDrawReflection = False
- m_bCanDoAlphaBlend = False
- m_bCanDoClipPlanes = False
- m_bDrawHelp = False
- m_vPosition = vec3(0, 3, -4)
- m_vVelocity = vec3(0, 0, 0)
- m_fYaw = 0
- m_fYawVelocity = 0
- m_fPitch = 0.5
- m_fPitchVelocity = 0
- g_clrColor(0) = ColorValue4(1, 1, 1, 1)
- g_clrColor(1) = ColorValue4(1, 0.5, 0.5, 1)
- g_clrColor(2) = ColorValue4(0.5, 1, 0.5, 1)
- g_clrColor(3) = ColorValue4(0.125, 0.5, 1, 1)
- g_clrColorFade(0) = ColorValue4(1, 0.25, 0.25, 1)
- g_clrColorFade(1) = ColorValue4(1, 0.25, 0.25, 1)
- g_clrColorFade(2) = ColorValue4(0.25, 0.75, 0.25, 1)
- g_clrColorFade(3) = ColorValue4(0.125, 0.25, 0.75, 1)
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: OneTimeSceneInit()
- ' Desc: Called during initial app startup, this function performs all the
- ' permanent initialization.
- '-----------------------------------------------------------------------------
- Sub OneTimeSceneInit()
- D3DXMatrixTranslation m_matView, 0, 0, 10
- D3DXMatrixTranslation m_matOrientation, 0, 0, 0
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: FrameMove()
- ' Desc: Called once per frame, the call is the entry point for animating
- ' the scene.
- '-----------------------------------------------------------------------------
- Sub FrameMove()
-
- If m_bStopSim = True Then Exit Sub
-
- g_fTime = DXUtil_Timer(TIMER_GETAPPTIME) * 1.3
- m_fElapsedTime = g_fTime - g_fLastTime
- g_fLastTime = g_fTime
- If m_fElapsedTime < 0 Then Exit Sub
-
- ' Slow things down for the REF device
- If (g_devType = D3DDEVTYPE_REF) Then m_fElapsedTime = 0.05
- Dim fSpeed As Single
- Dim fAngularSpeed
- fSpeed = 5 * m_fElapsedTime
- fAngularSpeed = 1 * m_fElapsedTime
- ' Slowdown the camera movement
- D3DXVec3Scale m_vVelocity, m_vVelocity, 0.9
- m_fYawVelocity = m_fYawVelocity * 0.9
- m_fPitchVelocity = m_fPitchVelocity * 0.9
- ' Process keyboard input
- If (m_bKey(vbKeyRight)) Then m_vVelocity.x = m_vVelocity.x + fSpeed ' Slide Right
- If (m_bKey(vbKeyLeft)) Then m_vVelocity.x = m_vVelocity.x - fSpeed ' Slide Left
- If (m_bKey(vbKeyUp)) Then m_vVelocity.y = m_vVelocity.y + fSpeed ' Move up
- If (m_bKey(vbKeyDown)) Then m_vVelocity.y = m_vVelocity.y - fSpeed ' Move down
- If (m_bKey(vbKeyW)) Then m_vVelocity.z = m_vVelocity.z + fSpeed ' Move Forward
- If (m_bKey(vbKeyS)) Then m_vVelocity.z = m_vVelocity.z - fSpeed ' Move Backward
- If (m_bKey(vbKeyE)) Then m_fYawVelocity = m_fYawVelocity + fSpeed ' Yaw right
- If (m_bKey(vbKeyQ)) Then m_fYawVelocity = m_fYawVelocity - fSpeed ' Yaw left
- If (m_bKey(vbKeyZ)) Then m_fPitchVelocity = m_fPitchVelocity + fSpeed ' turn down
- If (m_bKey(vbKeyA)) Then m_fPitchVelocity = m_fPitchVelocity - fSpeed ' turn up
- If (m_bKey(vbKeyAdd)) Then
- If (m_NumParticlesToEmit < 10) Then m_NumParticlesToEmit = m_NumParticlesToEmit + 1
- End If
- If (m_bKey(vbKeySubtract)) Then
- If (m_NumParticlesToEmit > 0) Then m_NumParticlesToEmit = m_NumParticlesToEmit - 1
- End If
- ' Update the position vector
- Dim vT As D3DVECTOR, vTemp As D3DVECTOR
- D3DXVec3Scale vTemp, m_vVelocity, fSpeed
- D3DXVec3Add vT, vT, vTemp
- D3DXVec3TransformNormal vT, vT, m_matOrientation
- D3DXVec3Add m_vPosition, m_vPosition, vT
- If (m_vPosition.y < 1) Then m_vPosition.y = 1
- ' Update the yaw-pitch-rotation vector
- m_fYaw = m_fYaw + fAngularSpeed * m_fYawVelocity
- m_fPitch = m_fPitch + fAngularSpeed * m_fPitchVelocity
- If (m_fPitch < 0) Then m_fPitch = 0
- If (m_fPitch > g_pi / 2) Then m_fPitch = g_pi / 2
- Dim qR As D3DQUATERNION, det As Single
- D3DXQuaternionRotationYawPitchRoll qR, m_fYaw, m_fPitch, 0
- D3DXMatrixAffineTransformation m_matOrientation, 1.25, vec3(0, 0, 0), qR, m_vPosition
- D3DXMatrixInverse m_matView, det, m_matOrientation
- ' Update particle system
- If (m_bStaticParticle) Then
- m_ParticleSystem.Update m_fElapsedTime, m_NumParticlesToEmit, _
- g_clrColor(m_nParticleColor), _
- g_clrColorFade(m_nParticleColor), 8, _
- vec3(0, 0, 0)
- Else
- m_ParticleSystem.Update m_fElapsedTime, m_NumParticlesToEmit, _
- g_clrColor(m_nParticleColor), _
- g_clrColorFade(m_nParticleColor), 8, _
- vec3(3 * Sin(g_fTime), 0, 3 * Cos(g_fTime))
- End If
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: Render()
- ' Desc: Called once per frame, the call is the entry point for 3d
- ' rendering. This function sets up render states, clears the
- ' viewport, and renders the scene.
- '-----------------------------------------------------------------------------
- Function Render() As Boolean
- Dim v As CUSTOMVERTEX
- Dim hr As Long
- 'See what state the device is in.
- Render = False
- hr = g_dev.TestCooperativeLevel
- If hr = D3DERR_DEVICENOTRESET Then
- g_dev.Reset g_d3dpp
- RestoreDeviceObjects
- End If
- 'dont bother rendering if we are not ready yet
- If hr <> 0 Then Exit Function
- Render = True
- ' Clear the backbuffer
- D3DUtil_ClearAll &HFF&
- With g_dev
- .BeginScene
-
-
- ' Draw reflection of particles
- If (m_bDrawReflection) Then
- Dim matReflectedView As D3DMATRIX
-
- D3DXMatrixReflect matReflectedView, m_planeGround
- D3DXMatrixMultiply matReflectedView, matReflectedView, m_matView
- .SetTransform D3DTS_VIEW, matReflectedView
- 'Dim clipplane As D3DCLIPPLANE
- 'LSet clipplane = m_planeGround
- '.SetClipPlane 0, clipplane
- .SetRenderState D3DRS_CLIPPLANEENABLE, D3DCLIPPLANE0
- ' Draw particles
- .SetTexture 0, m_ParticleTexture
- .SetRenderState D3DRS_ZWRITEENABLE, 0 'FALSE
- .SetRenderState D3DRS_ALPHABLENDENABLE, 1 'TRUE
- m_ParticleSystem.Render g_dev
- .SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
- .SetRenderState D3DRS_ZWRITEENABLE, 1 'True
- .SetRenderState D3DRS_CLIPPLANEENABLE, 0 'FALSE
- .SetRenderState D3DRS_ALPHABLENDENABLE, 1 'True
- .SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
- .SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
- .SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
- End If
- .SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
- .SetRenderState D3DRS_ZWRITEENABLE, 1 'True
- .SetRenderState D3DRS_CLIPPLANEENABLE, 0 'FALSE
- .SetRenderState D3DRS_ALPHABLENDENABLE, 1 '1 'True
- .SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
- .SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
- .SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
-
-
- ' Draw ground
- .SetTransform D3DTS_VIEW, m_matView
- .SetTexture 0, m_GroundTexture
- .SetVertexShader D3DFVF_COLORVERTEX
- .SetStreamSource 0, m_GroundVB, Len(v)
- .SetIndices m_GroundIB, 0
- .DrawIndexedPrimitive D3DPT_TRIANGLELIST, _
- 0, m_NumGroundVertices, _
- 0, (m_NumGroundIndices / 3)
- ' Draw particles
- .SetRenderState D3DRS_ALPHABLENDENABLE, 1 'True
- .SetRenderState D3DRS_SRCBLEND, D3DBLEND_ONE
- .SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
- .SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1
- .SetRenderState D3DRS_ZWRITEENABLE, 0 'False
- .SetRenderState D3DRS_ZENABLE, 1 'TRUE
- .SetTexture 0, m_ParticleTexture
- .SetRenderState D3DRS_ZENABLE, 0 'False
- .SetTexture 0, m_ParticleTexture
- m_ParticleSystem.Render g_dev
- .SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
- .SetRenderState D3DRS_ZWRITEENABLE, 1 'True
- .EndScene
- End With
- End Function
- '-----------------------------------------------------------------------------
- ' Name: InitDeviceObjects()
- ' Desc: Initialize scene objects.
- '-----------------------------------------------------------------------------
- Function InitDeviceObjects() As Boolean
- Dim i As Long
- Dim v As CUSTOMVERTEX
- Set m_GroundTexture = D3DUtil_CreateTexture(g_dev, "Ground2.bmp", D3DFMT_UNKNOWN)
- Set m_ParticleTexture = D3DUtil_CreateTexture(g_dev, "Particle.bmp", D3DFMT_UNKNOWN)
-
- ' Check if we can do the reflection effect
- m_bCanDoAlphaBlend = ((g_d3dCaps.SrcBlendCaps And D3DPBLENDCAPS_SRCALPHA) = D3DPBLENDCAPS_SRCALPHA) And _
- ((g_d3dCaps.DestBlendCaps And D3DPBLENDCAPS_INVSRCALPHA) = D3DPBLENDCAPS_INVSRCALPHA)
- m_bCanDoClipPlanes = (g_d3dCaps.MaxUserClipPlanes >= 1)
- ' Note: all HW with Software Vertex Processing can do clipplanes
- m_bCanDoClipPlanes = True
-
- If (m_bCanDoAlphaBlend And m_bCanDoClipPlanes) Then m_bDrawReflection = True
- ' Create ground object
-
- ' Create vertex buffer for ground object
- Set m_GroundVB = g_dev.CreateVertexBuffer(m_NumGroundVertices * Len(v), _
- 0, D3DFVF_COLORVERTEX, D3DPOOL_MANAGED)
-
- ' Fill vertex buffer
- Dim zz As Long, xx As Long
-
- ReDim m_grVerts(GROUND_GRIDSIZE * GROUND_GRIDSIZE * 6)
-
-
- i = 0
- For zz = 0 To GROUND_GRIDSIZE
- For xx = 0 To GROUND_GRIDSIZE
-
- m_grVerts(i).v.x = GROUND_WIDTH * ((xx / GROUND_GRIDSIZE) - 0.5)
- m_grVerts(i).v.y = 0
- m_grVerts(i).v.z = GROUND_HEIGHT * ((zz / GROUND_GRIDSIZE) - 0.5)
- m_grVerts(i).color = GROUND_COLOR
- m_grVerts(i).tu = xx * (GROUND_TILE / GROUND_GRIDSIZE)
- m_grVerts(i).tv = zz * (GROUND_TILE / GROUND_GRIDSIZE)
- i = i + 1
- Next
- Next
- D3DVertexBuffer8SetData m_GroundVB, 0, Len(v) * (GROUND_GRIDSIZE + 1) * (GROUND_GRIDSIZE + 1), 0, m_grVerts(0)
- Dim vtx As Long
- Dim m_Indices() As Integer
- ReDim m_Indices(m_NumGroundIndices * 4)
- Dim z As Long, x As Long
- ' Create the index buffer
- Set m_GroundIB = g_dev.CreateIndexBuffer(m_NumGroundIndices * 2, _
- 0, _
- D3DFMT_INDEX16, D3DPOOL_MANAGED)
-
- ' Fill in indices
- i = 0
- For z = 0 To GROUND_GRIDSIZE - 1
- For x = 0 To GROUND_GRIDSIZE - 1
-
- vtx = x + z * (GROUND_GRIDSIZE + 1)
- m_Indices(i) = vtx + 1: i = i + 1
- m_Indices(i) = vtx + 0: i = i + 1
- m_Indices(i) = vtx + 0 + (GROUND_GRIDSIZE + 1): i = i + 1
- m_Indices(i) = vtx + 1: i = i + 1
- m_Indices(i) = vtx + 0 + (GROUND_GRIDSIZE + 1): i = i + 1
- m_Indices(i) = vtx + 1 + (GROUND_GRIDSIZE + 1): i = i + 1
-
- Next
- Next
- D3DIndexBuffer8SetData m_GroundIB, 0, 2 * m_NumGroundIndices, 0, m_Indices(0)
- ' Initialize the particle system
- m_ParticleSystem.InitDeviceObjects g_dev
-
- InitDeviceObjects = True
- End Function
- '-----------------------------------------------------------------------------
- ' Name: VerifyDevice()
- '-----------------------------------------------------------------------------
- Function VerifyDevice(Behavior As Long, format As CONST_D3DFORMAT) As Boolean
- ' Make sure device can do ONE:ONE alphablending
- If (0 = (g_d3dCaps.SrcBlendCaps And D3DPBLENDCAPS_ONE) = D3DPBLENDCAPS_ONE) Then Exit Function
- If (0 = (g_d3dCaps.DestBlendCaps And D3DPBLENDCAPS_ONE) = D3DPBLENDCAPS_ONE) Then Exit Function
-
- ' We will run this app using software vertex processing
- If (Behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING) Then Exit Function
- VerifyDevice = True
- End Function
- '-----------------------------------------------------------------------------
- ' Name: DeleteDeviceObjects()
- ' Desc: Called when the app is exitting, or the device is being changed,
- ' this function deletes any device dependant objects.
- '-----------------------------------------------------------------------------
- Sub DeleteDeviceObjects()
- Set m_GroundTexture = Nothing
- Set m_ParticleTexture = Nothing
- Set m_GroundVB = Nothing
- Set m_GroundIB = Nothing
- If (m_ParticleSystem Is Nothing) Then Exit Sub
- m_ParticleSystem.DeleteDeviceObjects
- m_binit = False
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: FinalCleanup()
- ' Desc: Called before the app exits, this function gives the app the chance
- ' to cleanup after itself.
- '-----------------------------------------------------------------------------
- Sub FinalCleanup()
- Set m_GroundTexture = Nothing
- Set m_ParticleTexture = Nothing
- Set m_ParticleSystem = Nothing
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: InvalidateDeviceObjects()
- ' Desc: Place code to release non managed objects here
- '-----------------------------------------------------------------------------
- Sub InvalidateDeviceObjects()
- 'all objects are managed in this sample
- End Sub
- '-----------------------------------------------------------------------------
- ' Name: RestoreDeviceObjects()
- ' Desc:
- '-----------------------------------------------------------------------------
- Sub RestoreDeviceObjects()
- ' Set the world matrix
- Dim matWorld As D3DMATRIX
- D3DXMatrixIdentity matWorld
- g_dev.SetTransform D3DTS_WORLD, matWorld
- ' Set projection matrix
- Dim matProj As D3DMATRIX
- D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, Me.ScaleHeight / Me.ScaleWidth, 0.1, 100
- g_dev.SetTransform D3DTS_PROJECTION, matProj
- ' Set renderstates
- With g_dev
- Call .SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)
- Call .SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)
- Call .SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR)
- Call .SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
- Call .SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)
- Call .SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE)
- Call .SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE)
- Call .SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE)
- Call .SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE)
- Call .SetRenderState(D3DRS_LIGHTING, 0) 'FALSE
- Call .SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW)
- Call .SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT)
- End With
- End Sub
-